/******************************************************************************* 
  Copyright (C), 1988-2020, zeno Tech. Co., Ltd.
  Description:  日志模块，提供统一的日志输出格式，日志信息包含：重要程度、
                所属模块、输出位置、输出原因。输出的日志信息可控。
  Function List:   
     LOG_Init()     //内核态不需要调用
         |
         |
        \ /
    日志打印函数 
         |
         |
        \ /
    LOG_Exit()      //内核态不需要调用
*******************************************************************************/
#ifndef LOG_H 
#define LOG_H 

#ifdef __cplusplus
extern "C" {
#endif

/*=============================================================================
                                 Includes                                  
==============================================================================*/
#ifdef __HuaweiLite__
#include "unistd.h"
#else
#ifdef __KERNEL__    /* Linux kernel */
#else 
#include <stdio.h>
#endif
#endif

/*=============================================================================
                               Macro Definition
==============================================================================*/
/* 颜色宏定义 */
#define LOG_NONE          "\033[m"   
#define LOG_RED           "\033[0;32;31m"   
#define LOG_GREEN         "\033[0;32;32m"   
#define LOG_BLUE          "\033[0;32;34m"   
#define LOG_DARY_GRAY     "\033[1;30m"   
#define LOG_CYAN          "\033[0;36m"   
#define LOG_PURPLE        "\033[0;35m"     
#define LOG_BROWN         "\033[0;33m"   
#define LOG_YELLOW        "\033[1;33m"   
#define LOG_WHITE         "\033[1;37m" 

/* 日志前缀，包括颜色和字符串前缀 */
#define LOG_ERROR_PRE_STR       LOG_RED "[ERROR]: "
#define LOG_WARN_PRE_STR        LOG_YELLOW "[WARN]: "
#define LOG_INFO_PRE_STR        LOG_GREEN "[INFO]: "

/* 日志等级前缀 */
#define LOG_ERROR_PRE           "{-0-}"
#define LOG_WARN_PRE            "{-1-}"
#define LOG_INFO_PRE            "{-2-}"

#ifdef __HuaweiLite__
void LOG_Printf(const char *pFmt, ...);
#define LOG_Print   LOG_Printf
#else
#ifdef __KERNEL__ 
#define LOG_Print   printk
#else
#define LOG_Print   printf
#endif
#endif

#define LOG_PrintError(fmt, ...)    \
                        LOG_Print(LOG_ERROR_PRE LOG_ERROR_PRE_STR \
                        "[" LOG_MODULE_NAME "]" "(%d)%s -- " fmt LOG_NONE, \
                        __LINE__, __FUNCTION__, ##__VA_ARGS__)

#define LOG_PrintWarn(fmt, ...)    \
                        LOG_Print(LOG_WARN_PRE LOG_WARN_PRE_STR \
                        "[" LOG_MODULE_NAME "]" "(%d)%s -- " fmt LOG_NONE, \
                        __LINE__, __FUNCTION__, ##__VA_ARGS__)
                        
#define LOG_PrintInfo(fmt, ...)    \
                        LOG_Print(LOG_INFO_PRE LOG_INFO_PRE_STR \
                        "[" LOG_MODULE_NAME "]" "(%d)%s -- " fmt LOG_NONE, \
                        __LINE__, __FUNCTION__, ##__VA_ARGS__)
                         
#define LOG_PrintErrorRaw(fmt, ...)    \
                        LOG_Print(LOG_ERROR_PRE LOG_RED fmt LOG_NONE, \
                        ##__VA_ARGS__)

#define LOG_PrintWarnRaw(fmt, ...)    \
                        LOG_Print(LOG_WARN_PRE LOG_YELLOW fmt LOG_NONE, \
                        ##__VA_ARGS__)

#define LOG_PrintInfoRaw(fmt, ...)    \
                        LOG_Print(LOG_INFO_PRE LOG_GREEN fmt LOG_NONE, \
                        ##__VA_ARGS__)

                        
/*=============================================================================
                        Local Structures and Typedef 
==============================================================================*/
/* 重启类型 */
typedef enum 
{
    LOG_REBOOT_TYPE_POWEROFF,   /* 掉电重启 */
    LOG_REBOOT_TYPE_ERROR,      /* 异常重启 */
    LOG_REBOOT_TYPE_DEFUAL,     /* 恢复默认 */
    LOG_REBOOT_TYPE_NOMAL,      /* 正常重启 */
}LOG_rebootType_t;


/*=============================================================================
                             extern  Variables                                  
==============================================================================*/


/*=============================================================================
                             Function Definition                                  
==============================================================================*/ 

/*******************************************************************************
  Function:     LOG_Banner
  Description:  输出模块版本信息
  Input:        无
  Output:       无
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/ 
static inline void LOG_Banner(void)
{
    LOG_PrintInfoRaw("\n=======================================================\n"
              "[" LOG_MODULE_NAME "] : built on " __DATE__ " at " __TIME__ ". "
              "SVN version : %d. "
              "\n=======================================================\n",
              SVN_NUM); 
}

#if !(defined __KERNEL__) || (defined __HuaweiLite__)

/*******************************************************************************
  Function:     LOG_Init
  Description:  日志模块初始化
  Input:        无
  Output:       无
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/ 
int LOG_Init(void);


/*******************************************************************************
  Function:     LOG_Exit
  Description:  日志模块注销
  Input:        无
  Input:        无
  Output:       无
  Return:       无
  Others:       无
*******************************************************************************/
void LOG_Exit(void);

/*******************************************************************************
  Function:     LOG_SetRebootType
  Description:  配置设备重启模式
  Input:        - rebootType: 设备重启模式, 定义见LOG_rebootType_t
  Output:       无
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/
int LOG_SetRebootType(int rebootType);


/*******************************************************************************
  Function:     LOG_GetRebootType
  Description:  获取设备重启模式
  Input:        无
  Output:       - pRebootType: 设备重启模式, 定义见LOG_rebootType_t
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/
int LOG_GetRebootType(int *pRebootType);
#endif

#ifndef __KERNEL__
/*******************************************************************************
  Function:     LOG_GetTerminal
  Description:  获取设备重定向终端路径
  Input:        无
  Output:       - pTerminal: 设备重定向终端路径，缓存长度必须大于路径长度
  Return:       0: 操作成功
                ~0: 操作失败
  Others:       无
*******************************************************************************/
int LOG_GetTerminal(char *pTerminal, unsigned int len);
#endif // __KERNEL__

#ifdef __cplusplus
}
#endif
#endif // LOG_H
